Micron Document
🎖️GitЯра🎖️

Node / meshcore / MeshCore / files / src / helpers / bridges / ESPNowBridge.cpp

Displaying Raw • Download

src/helpers/bridges/ESPNowBridge.cpp 93b2db63de9009af047a2d0e1bcd97b4b0ba7106 (93b2db63) Text, 6.57 KB

Tff7b72#Tff7b72include T8b949e"ESPNowBridge.h"

Tff7b72#Tff7b72include T8b949e<WiFi.h>
Tff7b72#Tff7b72include T8b949e<esp_wifi.h>

Tff7b72#Tff7b72ifdef WITH_ESPNOW_BRIDGE

T8b949e// Static member to handle callbacks
Te6edf3ESPNowBridge Tff7b72*Te6edf3ESPNowBridgeTff7b72:Tff7b72:Te6edf3_instance Tff7b72= Tffa657nullptrTb4b4b4;

T8b949e// Static callback wrappers
Tffa657void Td2a8ffESPNowBridge::recv_cbTb4b4b4(Tff7b72const Tffa657uint8_t Tff7b72*Te6edf3macTb4b4b4, Tff7b72const Tffa657uint8_t Tff7b72*Te6edf3dataTb4b4b4, Tffa657int32_t Te6edf3lenTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_instanceTb4b4b4) Tb4b4b4{
Te6edf3_instanceTff7b72-Tff7b72>Te6edf3onDataRecvTb4b4b4(Te6edf3macTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3lenTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tffa657void Td2a8ffESPNowBridge::send_cbTb4b4b4(Tff7b72const Tffa657uint8_t Tff7b72*Te6edf3macTb4b4b4, Te6edf3esp_now_send_status_t Te6edf3statusTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_instanceTb4b4b4) Tb4b4b4{
Te6edf3_instanceTff7b72-Tff7b72>Te6edf3onDataSentTb4b4b4(Te6edf3macTb4b4b4, Te6edf3statusTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Te6edf3ESPNowBridgeTff7b72:Tff7b72:Te6edf3ESPNowBridgeTb4b4b4(Te6edf3NodePrefs Tff7b72*Te6edf3prefsTb4b4b4, Te6edf3meshTff7b72:Tff7b72:Te6edf3PacketManager Tff7b72*Te6edf3mgrTb4b4b4, Te6edf3meshTff7b72:Tff7b72:Te6edf3RTCClock Tff7b72*Te6edf3rtcTb4b4b4)
Tff7b72: Te6edf3BridgeBaseTb4b4b4(Te6edf3prefsTb4b4b4, Te6edf3mgrTb4b4b4, Te6edf3rtcTb4b4b4)Tb4b4b4, Te6edf3_rx_buffer_posTb4b4b4(T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3_instance Tff7b72= Tff7b72thisTb4b4b4;
Tb4b4b4}

Tffa657void Te6edf3ESPNowBridgeTff7b72:Tff7b72:Te6edf3beginTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffInitializing...Tffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4;

T8b949e// Initialize WiFi in station mode
Te6edf3WiFiTb4b4b4.Te6edf3modeTb4b4b4(Te6edf3WIFI_STATb4b4b4)Tb4b4b4;
T8b949e// Set Wi-Fi channel
Tff7b72if Tb4b4b4(Te6edf3esp_wifi_set_channelTb4b4b4(Te6edf3_prefsTff7b72-Tff7b72>Te6edf3bridge_channelTb4b4b4, Te6edf3WIFI_SECOND_CHAN_NONETb4b4b4) Tff7b72!Tff7b72= Te6edf3ESP_OKTb4b4b4) Tb4b4b4{
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffError setting WIFI channel to %dTffea00\nTa5d6ff"Tb4b4b4, Te6edf3_prefsTff7b72-Tff7b72>Te6edf3bridge_channelTb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}

T8b949e// Initialize ESP-NOW
Tff7b72if Tb4b4b4(Te6edf3esp_now_initTb4b4b4(Tb4b4b4) Tff7b72!Tff7b72= Te6edf3ESP_OKTb4b4b4) Tb4b4b4{
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffError initializing ESP-NOWTffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}

T8b949e// Register callbacks
Te6edf3esp_now_register_recv_cbTb4b4b4(Te6edf3recv_cbTb4b4b4)Tb4b4b4;
Te6edf3esp_now_register_send_cbTb4b4b4(Te6edf3send_cbTb4b4b4)Tb4b4b4;

T8b949e// Add broadcast peer
Te6edf3esp_now_peer_info_t Te6edf3peerInfo Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4;
Te6edf3memsetTb4b4b4(Tff7b72&Te6edf3peerInfoTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3peerInfoTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3memsetTb4b4b4(Te6edf3peerInfoTb4b4b4.Te6edf3peer_addrTb4b4b4, T79c0ff0xFFTb4b4b4, Te6edf3ESP_NOW_ETH_ALENTb4b4b4)Tb4b4b4; T8b949e// Broadcast address
Te6edf3peerInfoTb4b4b4.Te6edf3channel Tff7b72= Te6edf3_prefsTff7b72-Tff7b72>Te6edf3bridge_channelTb4b4b4;
Te6edf3peerInfoTb4b4b4.Te6edf3encrypt Tff7b72= Tffa657falseTb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3esp_now_add_peerTb4b4b4(Tff7b72&Te6edf3peerInfoTb4b4b4) Tff7b72!Tff7b72= Te6edf3ESP_OKTb4b4b4) Tb4b4b4{
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffFailed to add broadcast peerTffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}

T8b949e// Update bridge state
Te6edf3_initialized Tff7b72= Tffa657trueTb4b4b4;
Tb4b4b4}

Tffa657void Te6edf3ESPNowBridgeTff7b72:Tff7b72:Te6edf3endTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffStopping...Tffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4;

T8b949e// Remove broadcast peer
Tffa657uint8_t Te6edf3broadcastAddressTb4b4b4[Tb4b4b4] Tff7b72= Tb4b4b4{ T79c0ff0xFFTb4b4b4, T79c0ff0xFFTb4b4b4, T79c0ff0xFFTb4b4b4, T79c0ff0xFFTb4b4b4, T79c0ff0xFFTb4b4b4, T79c0ff0xFF Tb4b4b4}Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3esp_now_del_peerTb4b4b4(Te6edf3broadcastAddressTb4b4b4) Tff7b72!Tff7b72= Te6edf3ESP_OKTb4b4b4) Tb4b4b4{
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffError removing broadcast peerTffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e// Unregister callbacks
Te6edf3esp_now_register_recv_cbTb4b4b4(Tffa657nullptrTb4b4b4)Tb4b4b4;
Te6edf3esp_now_register_send_cbTb4b4b4(Tffa657nullptrTb4b4b4)Tb4b4b4;

T8b949e// Deinitialize ESP-NOW
Tff7b72if Tb4b4b4(Te6edf3esp_now_deinitTb4b4b4(Tb4b4b4) Tff7b72!Tff7b72= Te6edf3ESP_OKTb4b4b4) Tb4b4b4{
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffError deinitializing ESP-NOWTffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e// Turn off WiFi
Te6edf3WiFiTb4b4b4.Te6edf3modeTb4b4b4(Te6edf3WIFI_OFFTb4b4b4)Tb4b4b4;

T8b949e// Update bridge state
Te6edf3_initialized Tff7b72= Tffa657falseTb4b4b4;
Tb4b4b4}

Tffa657void Te6edf3ESPNowBridgeTff7b72:Tff7b72:Te6edf3loopTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// Nothing to do here - ESP-NOW is callback based
Tb4b4b4}

Tffa657void Te6edf3ESPNowBridgeTff7b72:Tff7b72:Te6edf3xorCryptTb4b4b4(Tffa657uint8_t Tff7b72*Te6edf3dataTb4b4b4, Tffa657size_t Te6edf3lenTb4b4b4) Tb4b4b4{
Tffa657size_t Te6edf3keyLen Tff7b72= Te6edf3strlenTb4b4b4(Te6edf3_prefsTff7b72-Tff7b72>Te6edf3bridge_secretTb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657size_t Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3lenTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3dataTb4b4b4[Te6edf3iTb4b4b4] Tff7b72^Tff7b72= Te6edf3_prefsTff7b72-Tff7b72>Te6edf3bridge_secretTb4b4b4[Te6edf3i Tff7b72% Te6edf3keyLenTb4b4b4]Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tffa657void Te6edf3ESPNowBridgeTff7b72:Tff7b72:Te6edf3onDataRecvTb4b4b4(Tff7b72const Tffa657uint8_t Tff7b72*Te6edf3macTb4b4b4, Tff7b72const Tffa657uint8_t Tff7b72*Te6edf3dataTb4b4b4, Tffa657int32_t Te6edf3lenTb4b4b4) Tb4b4b4{
T8b949e// Ignore packets that are too small to contain header + checksum
Tff7b72if Tb4b4b4(Te6edf3len Tff7b72< Tb4b4b4(Te6edf3BRIDGE_MAGIC_SIZE Tff7b72+ Te6edf3BRIDGE_CHECKSUM_SIZETb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffRX packet too small, len=%dTffea00\nTa5d6ff"Tb4b4b4, Te6edf3lenTb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}

T8b949e// Validate total packet size
Tff7b72if Tb4b4b4(Te6edf3len Tff7b72> Te6edf3MAX_ESPNOW_PACKET_SIZETb4b4b4) Tb4b4b4{
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffRX packet too large, len=%dTffea00\nTa5d6ff"Tb4b4b4, Te6edf3lenTb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}

T8b949e// Check packet header magic
Tffa657uint16_t Te6edf3received_magic Tff7b72= Tb4b4b4(Te6edf3dataTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72<Tff7b72< T79c0ff8Tb4b4b4) Tff7b72| Te6edf3dataTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3received_magic Tff7b72!Tff7b72= Te6edf3BRIDGE_PACKET_MAGICTb4b4b4) Tb4b4b4{
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffRX invalid magic 0x%04XTffea00\nTa5d6ff"Tb4b4b4, Te6edf3received_magicTb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}

T8b949e// Make a copy we can decrypt
Tffa657uint8_t Te6edf3decryptedTb4b4b4[Te6edf3MAX_ESPNOW_PACKET_SIZETb4b4b4]Tb4b4b4;
Tff7b72const Tffa657size_t Te6edf3encryptedDataLen Tff7b72= Te6edf3len Tff7b72- Te6edf3BRIDGE_MAGIC_SIZETb4b4b4;
Te6edf3memcpyTb4b4b4(Te6edf3decryptedTb4b4b4, Te6edf3data Tff7b72+ Te6edf3BRIDGE_MAGIC_SIZETb4b4b4, Te6edf3encryptedDataLenTb4b4b4)Tb4b4b4;

T8b949e// Try to decrypt (checksum + payload)
Te6edf3xorCryptTb4b4b4(Te6edf3decryptedTb4b4b4, Te6edf3encryptedDataLenTb4b4b4)Tb4b4b4;

T8b949e// Validate checksum
Tffa657uint16_t Te6edf3received_checksum Tff7b72= Tb4b4b4(Te6edf3decryptedTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72<Tff7b72< T79c0ff8Tb4b4b4) Tff7b72| Te6edf3decryptedTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4;
Tff7b72const Tffa657size_t Te6edf3payloadLen Tff7b72= Te6edf3encryptedDataLen Tff7b72- Te6edf3BRIDGE_CHECKSUM_SIZETb4b4b4;

Tff7b72if Tb4b4b4(Tff7b72!Te6edf3validateChecksumTb4b4b4(Te6edf3decrypted Tff7b72+ Te6edf3BRIDGE_CHECKSUM_SIZETb4b4b4, Te6edf3payloadLenTb4b4b4, Te6edf3received_checksumTb4b4b4)Tb4b4b4) Tb4b4b4{
T8b949e// Failed to decrypt - likely from a different network
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffRX checksum mismatch, rcv=0x%04XTffea00\nTa5d6ff"Tb4b4b4, Te6edf3received_checksumTb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}

Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffRX, payload_len=%dTffea00\nTa5d6ff"Tb4b4b4, Te6edf3payloadLenTb4b4b4)Tb4b4b4;

T8b949e// Create mesh packet
Te6edf3meshTff7b72:Tff7b72:Te6edf3Packet Tff7b72*Te6edf3pkt Tff7b72= Te6edf3_instanceTff7b72-Tff7b72>Te6edf3_mgrTff7b72-Tff7b72>Te6edf3allocNewTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3pktTb4b4b4) Tff7b72returnTb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3readFromTb4b4b4(Te6edf3decrypted Tff7b72+ Te6edf3BRIDGE_CHECKSUM_SIZETb4b4b4, Te6edf3payloadLenTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_instanceTff7b72-Tff7b72>Te6edf3onPacketReceivedTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3_instanceTff7b72-Tff7b72>Te6edf3_mgrTff7b72-Tff7b72>Te6edf3freeTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tffa657void Te6edf3ESPNowBridgeTff7b72:Tff7b72:Te6edf3onDataSentTb4b4b4(Tff7b72const Tffa657uint8_t Tff7b72*Te6edf3mac_addrTb4b4b4, Te6edf3esp_now_send_status_t Te6edf3statusTb4b4b4) Tb4b4b4{
T8b949e// Could add transmission error handling here if needed
Tb4b4b4}

Tffa657void Te6edf3ESPNowBridgeTff7b72:Tff7b72:Te6edf3sendPacketTb4b4b4(Te6edf3meshTff7b72:Tff7b72:Te6edf3Packet Tff7b72*Te6edf3packetTb4b4b4) Tb4b4b4{
T8b949e// Guard against uninitialized state
Tff7b72if Tb4b4b4(Te6edf3_initialized Tff7b72=Tff7b72= Tffa657falseTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}

T8b949e// First validate the packet pointer
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3packetTb4b4b4) Tb4b4b4{
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffTX invalid packet pointerTffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Tff7b72!Te6edf3_seen_packetsTb4b4b4.Te6edf3wasSeenTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_seen_packetsTb4b4b4.Te6edf3markSeenTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4;
T8b949e// Create a temporary buffer just for size calculation and reuse for actual writing
Tffa657uint8_t Te6edf3sizingBufferTb4b4b4[Te6edf3MAX_PAYLOAD_SIZETb4b4b4]Tb4b4b4;
Tffa657uint16_t Te6edf3meshPacketLen Tff7b72= Te6edf3packetTff7b72-Tff7b72>Te6edf3writeToTb4b4b4(Te6edf3sizingBufferTb4b4b4)Tb4b4b4;

T8b949e// Check if packet fits within our maximum payload size
Tff7b72if Tb4b4b4(Te6edf3meshPacketLen Tff7b72> Te6edf3MAX_PAYLOAD_SIZETb4b4b4) Tb4b4b4{
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffTX packet too large (payload=%d, max=%d)Tffea00\nTa5d6ff"Tb4b4b4, Te6edf3meshPacketLenTb4b4b4,
Te6edf3MAX_PAYLOAD_SIZETb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}

Tffa657uint8_t Te6edf3bufferTb4b4b4[Te6edf3MAX_ESPNOW_PACKET_SIZETb4b4b4]Tb4b4b4;

T8b949e// Write magic header (2 bytes)
Te6edf3bufferTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= Tb4b4b4(Te6edf3BRIDGE_PACKET_MAGIC Tff7b72>Tff7b72> T79c0ff8Tb4b4b4) Tff7b72& T79c0ff0xFFTb4b4b4;
Te6edf3bufferTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= Te6edf3BRIDGE_PACKET_MAGIC Tff7b72& T79c0ff0xFFTb4b4b4;

T8b949e// Write packet payload starting after magic header and checksum
Tff7b72const Tffa657size_t Te6edf3packetOffset Tff7b72= Te6edf3BRIDGE_MAGIC_SIZE Tff7b72+ Te6edf3BRIDGE_CHECKSUM_SIZETb4b4b4;
Te6edf3memcpyTb4b4b4(Te6edf3buffer Tff7b72+ Te6edf3packetOffsetTb4b4b4, Te6edf3sizingBufferTb4b4b4, Te6edf3meshPacketLenTb4b4b4)Tb4b4b4;

T8b949e// Calculate and add checksum (only of the payload)
Tffa657uint16_t Te6edf3checksum Tff7b72= Te6edf3fletcher16Tb4b4b4(Te6edf3buffer Tff7b72+ Te6edf3packetOffsetTb4b4b4, Te6edf3meshPacketLenTb4b4b4)Tb4b4b4;
Te6edf3bufferTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72= Tb4b4b4(Te6edf3checksum Tff7b72>Tff7b72> T79c0ff8Tb4b4b4) Tff7b72& T79c0ff0xFFTb4b4b4; T8b949e// High byte
Te6edf3bufferTb4b4b4[T79c0ff3Tb4b4b4] Tff7b72= Te6edf3checksum Tff7b72& T79c0ff0xFFTb4b4b4; T8b949e// Low byte

T8b949e// Encrypt payload and checksum (not including magic header)
Te6edf3xorCryptTb4b4b4(Te6edf3buffer Tff7b72+ Te6edf3BRIDGE_MAGIC_SIZETb4b4b4, Te6edf3meshPacketLen Tff7b72+ Te6edf3BRIDGE_CHECKSUM_SIZETb4b4b4)Tb4b4b4;

T8b949e// Total packet size: magic header + checksum + payload
Tff7b72const Tffa657size_t Te6edf3totalPacketSize Tff7b72= Te6edf3BRIDGE_MAGIC_SIZE Tff7b72+ Te6edf3BRIDGE_CHECKSUM_SIZE Tff7b72+ Te6edf3meshPacketLenTb4b4b4;

T8b949e// Broadcast using ESP-NOW
Tffa657uint8_t Te6edf3broadcastAddressTb4b4b4[Tb4b4b4] Tff7b72= Tb4b4b4{ T79c0ff0xFFTb4b4b4, T79c0ff0xFFTb4b4b4, T79c0ff0xFFTb4b4b4, T79c0ff0xFFTb4b4b4, T79c0ff0xFFTb4b4b4, T79c0ff0xFF Tb4b4b4}Tb4b4b4;
Te6edf3esp_err_t Te6edf3result Tff7b72= Te6edf3esp_now_sendTb4b4b4(Te6edf3broadcastAddressTb4b4b4, Te6edf3bufferTb4b4b4, Te6edf3totalPacketSizeTb4b4b4)Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3result Tff7b72=Tff7b72= Te6edf3ESP_OKTb4b4b4) Tb4b4b4{
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffTX, len=%dTffea00\nTa5d6ff"Tb4b4b4, Te6edf3meshPacketLenTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffTX FAILED!Tffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tffa657void Te6edf3ESPNowBridgeTff7b72:Tff7b72:Te6edf3onPacketReceivedTb4b4b4(Te6edf3meshTff7b72:Tff7b72:Te6edf3Packet Tff7b72*Te6edf3packetTb4b4b4) Tb4b4b4{
Te6edf3handleReceivedPacketTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72#Tff7b72endif

Served by rngit 1.5.2 - Generated in 0.08s